# coding=utf-8
# -*- coding: utf-8 -*-


from config.config import monitorconfig
import time, datetime
import datagetter
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State

# 初始值


availablealiasjoboptions = [{'label': '社媒入口（DMZ）->社媒入口', 'value': '社媒入口（DMZ）->社媒入口'},
                            {'label': '中国人保APP认证平台->145.62', 'value': '中国人保APP认证平台->145.62'},
                            {'label': '中国人保APP认证平台->查询寿险用户信息', 'value': '中国人保APP认证平台->查询寿险用户信息'},
                            {'label': '中国人保APP认证平台->短信平台接口', 'value': '中国人保APP认证平台->短信平台接口'},
                            {'label': '掌上服务（微信）->集中审核平台', 'value': '掌上服务（微信）->集中审核平台'},
                            {'label': '掌上服务（微信）->ecif', 'value': '掌上服务（微信）->ecif'},
                            {'label': '掌上服务（微信）->理赔', 'value': '掌上服务（微信）->理赔'},
                            {'label': '掌上服务（微信）->定损', 'value': '掌上服务（微信）->定损'},
                            {'label': '掌上服务（微信）->修理厂', 'value': '掌上服务（微信）->修理厂'},
                            {'label': '掌上服务（微信）->快速数据平台', 'value': '掌上服务（微信）->快速数据平台'},
                            {'label': '掌上服务（微信）->承保', 'value': '掌上服务（微信）->承保'},
                            {'label': '掌上服务（微信）->网销个人中心', 'value': '掌上服务（微信）->网销个人中心'},
                            {'label': '掌上服务（微信）->客户俱乐部', 'value': '掌上服务（微信）->客户俱乐部'},
                            {'label': '掌上服务（微信）->发票平台', 'value': '掌上服务（微信）->发票平台'},
                            {'label': '掌上服务（微信）->接口', 'value': '掌上服务（微信）->接口'},
                            {'label': '中国人保APP内网F5->中国人保APP内网F5', 'value': '中国人保APP内网F5->中国人保APP内网F5'},
                            {'label': '掌上服务后台（APP）->ecif', 'value': '掌上服务后台（APP）->ecif'},
                            {'label': '掌上服务后台（APP）->健康险保单列表', 'value': '掌上服务后台（APP）->健康险保单列表'},
                            {'label': '掌上服务后台（APP）->健康险订单删除', 'value': '掌上服务后台（APP）->健康险订单删除'},
                            {'label': '掌上服务后台（APP）->网销个人中心', 'value': '掌上服务后台（APP）->网销个人中心'},
                            {'label': '掌上服务后台（APP）->寿险', 'value': '掌上服务后台（APP）->寿险'},
                            {'label': '掌上服务后台（APP）->资产', 'value': '掌上服务后台（APP）->资产'},
                            {'label': '掌上服务后台（APP）->客户俱乐部', 'value': '掌上服务后台（APP）->客户俱乐部'},
                            {'label': '掌上服务后台（APP）->集中审核平台', 'value': '掌上服务后台（APP）->集中审核平台'},
                            {'label': '人保E通入口（DMZ）->人保E通入口', 'value': '人保E通入口（DMZ）->人保E通入口'},
                            {'label': '驾驶行为入口（DMZ）->驾驶行为入口', 'value': '驾驶行为入口（DMZ）->驾驶行为入口'},
                            {'label': '掌上和人保APP入口（DMZ）->掌上&人保APP入口', 'value': '掌上和人保APP入口（DMZ）->掌上&人保APP入口'},
                            {'label': '掌上后台内网F5->掌上后台内网F5', 'value': '掌上后台内网F5->掌上后台内网F5'},
                            {'label': '社媒内网F5->社媒内网F5', 'value': '社媒内网F5->社媒内网F5'},
                            {'label': '掌上服务后台（微信）内网F5->掌上服务后台（微信）内网F5', 'value': '掌上服务后台（微信）内网F5->掌上服务后台（微信）内网F5'}]


# 初始化时间条件
def getdtstart():
    dtnow = datetime.datetime.now()
    if (dtnow.isoweekday() == 1):
        tmpstart = dtnow - datetime.timedelta(days=3)
    else:
        tmpstart = dtnow - datetime.timedelta(days=1)
    dtstart = '{} {}'.format(tmpstart.strftime('%Y-%m-%d'), '07:00')
    return dtstart


def getdtend():
    dtnow = datetime.datetime.now()
    dtend = '{} {}'.format(dtnow.strftime('%Y-%m-%d'), '07:00')
    return dtend


# 查询结果，并生成表格
def generate_talbe(joblist=None, starttime=None, endtime=None):
    tabledatalist = datagetter.generate_talbedata(joblist=joblist, starttime=starttime, endtime=endtime)
    # print(tabledatalist)
    # print(range(len(tabledatalist)-1))
    return html.Div([
        html.P('查询成功，查询时间：{},查询结果如下:'.format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))),
        html.Table(
            # Header
            [html.Tr([html.Th(col) for col in tabledatalist[0]])] +
            # Body
            [html.Tr([
                html.Td(tabledatalist[i + 1][col]) for col in range(len(tabledatalist[0]))
            ]) for i in range(len(tabledatalist) - 1)],
            className='gridtable')
    ])


app = dash.Dash(__name__)
app.layout = html.Div(children=[
    html.H1(children='天旦监控自动提数', style={
        'textAlign': 'center',
    }),
    html.Div([
        # html.Strong('若查询项目变了，请先选择查询的项目，默认查询项目与报表相同：',style={'border-bottom-style':'solid','border-bottom-width':'1px'}),
        html.Strong('若查询项目变了，请先选择查询的项目，默认查询项目与报表相同：'),
        # 写入查询
        html.Div(id='availablejobitemdiv', children=[dcc.Checklist(
            id='availablejobitem',
            options=availablealiasjoboptions,
            value=monitorconfig.joblist, style={
                'columnCount': 3
            })]),
        html.Div([
            html.Div(id='availablejobitemResDiv', style={'border-top-style': 'solid', 'border-top-width': '1px'}),
            html.Button('恢复默认', id='restorebtn', n_clicks=0, style={'margin-right': '5px'}),
            html.Button('若有必要，再刷新可用的监测项目', id='refreshbtn', n_clicks=0)
        ])

    ], style={
        'border-style': 'solid',
        'border-width': '1px',
        'margin': '0 auto',
        'text-align': 'left',
        'padding': '3px'
    }),
    html.Div([
        html.Span('请输入起始时间', style={'margin-right': '5px'}),
        dcc.Input(id='starttime', style={'margin-right': '5px'}, value=getdtstart(), type='text',
                  pattern=u'/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/'),
        html.Span('请输入截止时间', style={'margin-right': '5px'}),
        dcc.Input(id='endtime', style={'margin-right': '5px'}, value=getdtend(), type='text',
                  pattern=u'/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/'),
        html.Button('提交查询', id='querybtn', n_clicks=0, style={'float': 'right', 'margin-right': '5px'})
    ], style={
        'border-style': 'solid',
        'border-width': '1px',
        'margin': '0 auto',
        'text-align': 'left',
        'padding': '3px'
    }),
    html.Div([], id='datadiv', style={
        'border-style': 'solid',
        'border-width': '1px',
        'margin': '0 auto',
        'text-align': 'left',
        'padding': '3px'
    })
])


@app.callback(
    Output(component_id='availablejobitemResDiv', component_property='children'),
    [Input(component_id='availablejobitemdiv', component_property='children')]
)
def update_availablejobitemResTime(n_clicks):
    return html.Span('刷新时间{}'.format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')),
                     id='availablejobitemResTime')


# 恢复默认按钮
@app.callback(
    Output(component_id='availablejobitem', component_property='value'),
    [Input(component_id='restorebtn', component_property='n_clicks')]
)
def restore_default(n_clicks):
    if n_clicks > 0:
        return monitorconfig.joblist
    else:
        return monitorconfig.joblist


@app.callback(
    Output(component_id='availablejobitemdiv', component_property='children'),
    [Input(component_id='refreshbtn', component_property='n_clicks')]
)
def update_jobiten_div(n_clicks):
    if n_clicks > 0:
        availablealiasjobdict, availablealiasjoblist = datagetter.getAvailableItem()
        availablealiasjoboptions.clear()
        for item in availablealiasjoblist:
            availablealiasjoboptions.append({'label': item, 'value': item})
        datagetter.clean()
        return dcc.Checklist(
            id='availablejobitem',
            options=availablealiasjoboptions,
            value=monitorconfig.joblist, style={
                'columnCount': 3
            })
    else:
        return dcc.Checklist(
            id='availablejobitem',
            options=availablealiasjoboptions,
            value=monitorconfig.joblist, style={
                'columnCount': 3
            })


@app.callback(Output(component_id='datadiv', component_property='children'),
              [Input(component_id='querybtn', component_property='n_clicks')],
              [State(component_id='availablejobitem', component_property='value'),
               State(component_id='starttime', component_property='value'),
               State(component_id='endtime', component_property='value')])
def update_data_div(n_clicks, sejoblist, starttime, endttime):
    if n_clicks > 0:
        # return generate_talbe(joblist=sejoblist, starttime=starttime, endtime=endttime)
        table = None
        try:
            table = generate_talbe(joblist=sejoblist, starttime=starttime, endtime=endttime)
            datagetter.clean()
            return table
        except Exception as e:
            datagetter.clean()
            return html.Div([
                html.P(children=[
                    html.Span(['爬取失败！稍等一会儿重新点击查询按钮。'], style={'color': '#E53333'})]),
                html.P(children=[
                    html.Span(['{}'.format(str(e))], style={'color': '#E53333'})]),
            ])
    else:
        return html.Div([
            html.P(children=['本页面数据采用爬虫技术从天旦系统中爬取下来，', html.Strong(['有以下几点需要注意的地方：'])]),
            html.P(children=[html.Span(['1、爬取的时间可能较长，大约1分钟左右，故点击“查询”按钮后需要较长时间加载，请耐心等待。'], style={'color': '#E53333'})]),
            html.P(children=[html.Span(['2、有一定几率登录不成功。若发生登录不成功的情况，会报错，再次点击查询即可。'], style={'color': '#E53333'})]),
            html.P(children=[
                html.Span(['3、因为后台爬虫是单进程的\("▔□▔)/  所以两次点击查询的时间间隔不能太短，否则会造成爬虫死掉，造成出错。'], style={'color': '#E53333'})]),
            html.P(children=[html.Span(['4、爬取的结果，复制粘贴到模板中即可。'])]),
        ])


if __name__ == '__main__':
    app.run_server(host='0.0.0.0', port='8051', debug=True)
